﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Text;
using System.Text.RegularExpressions;
using System.Data.SqlClient;
using GenaralLibs;

namespace prjQlyKinhDoanh
{
    public class DBConnect
    {
        // Khởi tạo một đối tượng connection
        SqlConnection objConnection;

        // Contructor mặc định khởi tạo một đối tượng Connection
        public DBConnect()
        {
            string strConnectionString;
            //strConnectionString = System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"].ToString();
            strConnectionString = GetConnectionString(); 
            objConnection = new SqlConnection(strConnectionString);
        }

        // Contructor khởi tạo một đối tượng Connection bất kỳ
        public DBConnect(string strConnectionString)
        {
            objConnection = new SqlConnection(strConnectionString);
        }

        //Hàm xây dựng một đối tượng sqlCommand
        private SqlCommand buildQueryCommand(string strProcedureName, IDataParameter[] parameters)
        {
            SqlCommand mySqlCommand = new SqlCommand(strProcedureName, objConnection);
            mySqlCommand.CommandType = CommandType.StoredProcedure;
            mySqlCommand.CommandTimeout = 1800;
            mySqlCommand.Parameters.Clear();

            if (parameters != null)
            {
                try
                {
                    foreach (SqlParameter para in parameters)
                    {
                        mySqlCommand.Parameters.Add(para);
                    }
                }
                catch {}

            }

            return mySqlCommand;
        }

        private SqlCommand buildQueryCommand(string strProcedureName, CommandType oCommandType, IDataParameter[] parameters)
        {
            SqlCommand mySqlCommand = new SqlCommand(strProcedureName, objConnection);
            mySqlCommand.CommandType = oCommandType;
            mySqlCommand.CommandTimeout = 1800;
            mySqlCommand.Parameters.Clear();

            if (parameters != null)
            {
                try
                {
                    foreach (SqlParameter para in parameters)
                    {
                        mySqlCommand.Parameters.Add(para);
                    }
                }
                catch { }

            }

            return mySqlCommand;
        }

        //Hàm xây dựng một đối tượng sqlCommand, có tham số output
        private SqlCommand buildQueryCommand(string strProcedureName, IDataParameter[] parameters, int outPara)
        {
            SqlCommand mySqlCommand = new SqlCommand(strProcedureName, objConnection);
            mySqlCommand.CommandType = CommandType.StoredProcedure;
            mySqlCommand.CommandTimeout = 1800;
            mySqlCommand.Parameters.Clear();
            int intCount = 0;

            if (parameters != null)
            {
                try
                {
                    foreach (SqlParameter para in parameters)
                    {
                        mySqlCommand.Parameters.Add(para);

                        if (intCount == outPara)
                        {
                            mySqlCommand.Parameters[intCount].Direction = ParameterDirection.Output;
                        }
                        else
                        {
                            mySqlCommand.Parameters[intCount].Direction = ParameterDirection.Input;
                        }
                        intCount = intCount + 1;
                    }
                }
                catch {}
            }

            return mySqlCommand;
        }

        //Đóng connection
        private void closeConnectionBeforeOpen(SqlConnection conn)
        {
            if (conn.State == ConnectionState.Open)
            {
                conn.Close();
            }
        }

        // Hàm thực hiện một thủ tục có tham số và trả về một DataSet
        public DataSet returnDataSet(string strProcedureName, string tableName, IDataParameter[] parameters)
        {
            DataSet dsData = new DataSet();
            SqlDataAdapter daData = new SqlDataAdapter();

            try
            {
                // Đóng connection trước khi mở
                closeConnectionBeforeOpen(objConnection);
                objConnection.Open();
                daData.SelectCommand = buildQueryCommand(strProcedureName, parameters);
                daData.Fill(dsData, tableName);
            }
            catch{}
            finally
            {
                // Giải phóng tài nguyên connection chiếm giữ
                objConnection.Close();
            }

            return dsData;
        }

        // Hàm thực hiện một thủ tục có tham số và trả về một DataSet
        public DataSet returnDataSet(string strProcedureName, IDataParameter[] parameters)
        {
            DataSet dsData = new DataSet();
            SqlDataAdapter daData = new SqlDataAdapter();

            try
            {
                // Đóng connection trước khi mở
                closeConnectionBeforeOpen(objConnection);
                objConnection.Open();
                daData.SelectCommand = buildQueryCommand(strProcedureName, parameters);
                daData.Fill(dsData);
            }
            catch {}

            finally
            {
                // Giải phóng tài nguyên connection chiếm giữ
                objConnection.Close();
            }

            return dsData;
        }
        //Hàm thực thị một thủ tục không trả về dữ liệu
        public void ExecuteProcedure(string strProcedureName, IDataParameter[] parameters)
        {

            try
            {
                // Đóng connection trước khi mở
                closeConnectionBeforeOpen(objConnection);
                objConnection.Open();
                buildQueryCommand(strProcedureName, parameters).ExecuteNonQuery();

            }
            catch {}

            finally
            {
                // Giải phóng tài nguyên connection chiếm giữ
                objConnection.Close();
            }
        }

        //Hàm thực thị một thủ tục không trả về dữ liệu, có tham số output
        public void ExecuteProcedure(string strProcedureName, IDataParameter[] parameters, int outPara, out object objValue)
        {
            SqlCommand cmd = null;

            try
            {
                // Đóng connection trước khi mở
                closeConnectionBeforeOpen(objConnection);
                objConnection.Open();
                cmd = buildQueryCommand(strProcedureName, parameters, outPara);
                cmd.ExecuteNonQuery();
            }
            catch {}

            finally
            {
                // Giải phóng tài nguyên connection chiếm giữ
                objConnection.Close();
            }
            objValue = cmd.Parameters[outPara].Value;
        }

        // Hàm thực hiện một thủ tục có tham số và trả về một DataReader
        public SqlDataReader returDataReader(string strProcedureName, IDataParameter[] parameters)
        {
            SqlDataReader drData = null;

            try
            {
                // Đóng connection trước khi mở
                closeConnectionBeforeOpen(objConnection);
                objConnection.Open();
                SqlCommand SqlCmd = buildQueryCommand(strProcedureName, parameters);
                SqlCmd.CommandType = CommandType.StoredProcedure;
                drData = SqlCmd.ExecuteReader(CommandBehavior.CloseConnection);
                SqlCmd.Parameters.Clear();
            }
            catch 
            {
            }

            return drData;
        }

        public SqlDataReader returDataReader(string strSql)
        {
            SqlDataReader drData = null;

            try
            {
                // Đóng connection trước khi mở
                closeConnectionBeforeOpen(objConnection);
                objConnection.Open();
                SqlCommand SqlCmd =new SqlCommand(strSql, objConnection);
                SqlCmd.CommandType = CommandType.Text;
                drData = SqlCmd.ExecuteReader(CommandBehavior.CloseConnection);                
            }
            catch 
            {
            }

            return drData;
        }

        public static string GetConnectionString()
        {
            return LocalSettings.ConnectString;
            //string ServerName = System.Configuration.ConfigurationSettings.AppSettings.Get("ServerName");
            //string Database = System.Configuration.ConfigurationSettings.AppSettings.Get("Database");
            //string User = System.Configuration.ConfigurationSettings.AppSettings.Get("User");
            //string Password = System.Configuration.ConfigurationSettings.AppSettings.Get("Password");
            //return "Data Source=" + ServerName + ";Initial Catalog=" + Database + ";Persist Security Info=True;User ID=" + User + ";Password=" + Password + ";";
        }

    }
}
